package d5_list;

import java.util.StringJoiner;

/*
 *单链表
 *
 * */
public class MyLinkedList<E> {

    private int size = 0; //用于记录链表的元素个数

    //定义头指针
//    Node<E> first;
    MyLinkedList.Node<E> first;

    //定义节点类: 用于创建节点对象, 封装节点数据和下一个节点的地址值
    //面向对象思想: 万物皆对象 ---> 没一个节点就是一个对象
    public static class Node<E> {
        E item;
        Node<E> next;//只有这样才能记录下一个节点的地址

        public Node(E item, Node<E> next) {
            this.item = item;
            this.next = next;
        }
    }

    //添加数据的功能
    //拓展(建议把它搞懂)
    //指针无非就是指向节点,节点是对象,直接就是一个变量,记录的肯定是地址值
    public boolean add(E e) {
        //维护单链表
        //1、要考虑是不是第一个节点还是最后一个节点
        //就是 : 第一个节点, 或者后面的节点

        //创建一个节点对象, 封装这个数据
        Node<E> newNode = new Node<>(e, null);

        // 判断这个节点是否是第一个节点
        if (first == null) {
            first = newNode;
        } else {
            //把这个节点加入到当前最后一个节点下一个位置
            // 如何找到最后一个节点对象
            //注意一定不要懂头指针,要使用时一定要声明一个变量,进行使用
            Node<E> temp = first;//先记住头结点 --> 不能都头节点, 所以要用临时节点记录头结点
            while (temp.next != null) {
                temp = temp.next;//往下挪
            }
            //最后一个节点
            temp.next = newNode;

        }
        size++;//没加一次 更新容量
        return true;//添加数据总是能成功的
    }
    //进行展示链表元素


    @Override
    public String toString() {
        //拼接给用户
        //不清楚什么时候到最后一个数据
        StringJoiner sb = new StringJoiner(",", "[", "]");
        Node<E> temp = first; //永远不能动头节点, 动链表就完了
        while (temp != null) {
            sb.add(temp.item + " ");
            temp = temp.next;
        }
        return sb.toString();
    }

    public int getSize() {
        return size;
    }
}
class Test{
    public static void main(String[] args) {
        //创建链表
        MyLinkedList<String> list = new MyLinkedList<>();
        list.add("java1");
        list.add("java2");
        list.add("java3");
        list.add("java4");
        list.add("java5");
        list.add("java6");
        list.add("java7");
        list.add("java8");
        list.add("java9");
        list.add("java10");

        System.out.println(list);
    }
}